import { NestFactory } from '@nestjs/core';
import { AppModule } from './modules/app/app.module';
import { SwaggerModule, DocumentBuilder } from '@nestjs/swagger';
import { Logger, ValidationPipe } from '@nestjs/common';
import * as helmet from 'helmet';
import * as csurf from 'csurf';
const path = require('path')
import { ExceptionsFilter } from '@src/common/exceptions/error.filter'
import { TransformInterceptor } from '@src/common/interceptors/transform.interceptor'
import * as session from 'express-session';
import { config } from "@src/config/index"

async function bootstrap() {
  const app: any = await NestFactory.create(AppModule);

  // 设置 HTTP 头，Helmet 可以帮助保护您的应用免受一些众所周知的 Web 漏洞
  app.use(helmet());
  // 跨源资源共享（CORS）是一种允许从另一个域请求资源的机制
  app.enableCors();
  // 跨站点请求伪造（称为 CSRF 或 XSRF）是一种恶意利用网站，其中未经授权的命令从 Web 应用程序信任的用户传输。要减轻此类攻击，您可以使用 csurf 软件包
  // app.use(csurf());

  // 全局错误处理
  app.useGlobalFilters(new ExceptionsFilter())
  // 全局拦截器，统一处理时间戳
  app.useGlobalInterceptors(new TransformInterceptor())
  // 开启全局验证
  app.useGlobalPipes(new ValidationPipe());

  // swagger 文档
  const options = new DocumentBuilder()
    .setTitle(`${config.app.name} 接口文档`)
    .setDescription('The Nest.js Project API description')
    .setVersion('1.0')
    // .addTag('cats')
    .build();
  const document = SwaggerModule.createDocument(app, options);
  SwaggerModule.setup(config.swagger.urlPrefix, app, document);

  // 静态资源
  app.useStaticAssets(config.app.staticAssets,
    {
      prefix: config.app.staticPrefix
    });

  // 使用视图
  app.setBaseViewsDir(config.app.viewsDir);
  app.setViewEngine(config.app.viewEngine);

  // 使用session
  app.use(session(config.session))

  await app.listen(config.app.port);

  Logger.log(
    `Application is serving on http://${config.app.hostName}:${config.app.port}`,
    'NestApplication',
  );
}
bootstrap();
